// ts的常用类型

// 1.number
let age: number = 23
// age = '323'
console.log(age.toFixed())
// 2.string
let name: string = "zs"

// 3.boolean
let isShow: boolean = false

// 4.null
let nullTag: null = null

// 5.undefined
let b: undefined = undefined

// 6.symbol
let c: symbol = Symbol()
console.log(typeof age)

// 7.object-数组
let hobby: string[] = ['篮球', '足球']
console.log(hobby)
console.log(typeof hobby)

// 8.object-联合类型
let cs: (string | number)[] = ['fd', 34, '234fs']
console.log(cs)
console.log(typeof cs)
let ds: string | number = 'er'
let ds2: string | number = 65
console.log(ds, ds2)

// 为联合类型定义类型别名  不用重复写比较长的类型
type CustomArr = (string | number)[]
let arr: CustomArr = ['fe', 2]

// 函数的参数类型和返回值类型 第一种形式
function add(a: number, b: number): number {
    return a + b
}

console.log(add(2, 3))

// 第二种形式
const decide = (a: number, b: number): number => {
    return a - b
}
console.log(decide(2, 3))

// 第三种形式 同时定义参数和返回值
const add2: (num1: number, num2: number) => number = (num1, num2) => {
    return num1 + num2
}


// 函数类型 定义参数类型和返回值类型
function con(a: number): void {
    console.log(a)
}

con(34)

// 可选参数
function dayin(s1?: string, s2?: string): void {
    console.log(s1, s2)
}

dayin('23', '4543')
dayin()

// 对象类型
let person: {
    age: number
    name: string
    sayHello(msg: string): void
} = {
    age: 10,
    name: '张三',
    sayHello: (msg: string) => {
        console.log(msg, name)
    }
}
person.sayHello("3454353")
console.log(person.name)

// 接口
interface IPerson {
    age: number
    name: string

    sayHi(): void
}

let person1: IPerson = {
    age: 10,
    name: '43234',
    sayHi(): void {
        console.log(person.name)
    }
};
console.log(person1)

// 使用extends关键字实现继承
interface Point2D {
    x: number;
    y: number
}

interface Point3D extends Point2D {
    z: number
}

let td: Point3D = {
    x: 2,
    y: 34,
    z: 34
}
console.log(td)

// 元组
let position: [number, number] = [32, 432]
console.log(position)

// 类型断言  sd本来返回 HtmlElement 比较宽泛的类型  可以使用as 类型断言 将宽泛类型转为具体的 a标签类型
// let sd = document.getElementById('duan') as HTMLAnchorElement
// console.log(sd?.id)


// 字面量类型
// 用let声明的是string类型
let str1 = 'hello ts'
// 用const声明的是 'hello ts' 类型
const str2 = 'hello ts'

// 使用场景 规定direction 参数类型只能是 up，down，left，right
function changeDirection(direction: 'up' | 'down' | 'left' | 'right') {

}

// 传参时只能传这四个
changeDirection('left')

// 定义一个枚举类型 枚举语法  enum  成员首字母大写， 使用逗号隔开
enum Direction {Up = 'fdsf', Down = '423', Left = 90, Right}

function changeDir2(direction: Direction) {
    console.log(direction)
}

changeDir2(Direction.Up)

console.log(Direction.Down)

// any 不推荐使用， 对值进行任意操作都不会有报错提示
let sss: any = 0
// 将sss当做函数来写不会报错，但是运行时会报错
// sss()


const s = 'heee'
console.log(typeof s)


// ts 中的typeof  可以通过类型上下文 自动获取到类型
let p = {x: 1, y: 2}

function dong(pp: typeof p) {
    console.log(pp)
}

dong({x: 34, y: 4543})
